package org.jflame.fx.util;

import java.util.function.Consumer;

import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;

public final class TreeViewUtils {

    /**
     * 删除TreeView根节点下的所有子节点
     * 
     * @param <T>
     * @param treeView
     */
    public static <T> void clear(final TreeView<T> treeView) {
        if (treeView == null) {
            return;
        }
        TreeItem<T> root = treeView.getRoot();
        if (root != null && !root.isLeaf()) {
            root.getChildren()
                    .clear();
        }
    }

    /**
     * 展开TreeView的所有节点
     * 
     * @param <T>
     * @param treeView
     */
    public static <T> void expandAll(final TreeView<T> treeView) {
        TreeItem<T> node = treeView.getRoot();
        expandAll(node);
    }

    /**
     * 展开TreeItem的所有节点
     * 
     * @param <T>
     * @param node
     */
    public static <T> void expandAll(final TreeItem<T> node) {
        if (node != null) {
            if (!node.isExpanded()) {
                node.setExpanded(true);
            }
            if (!node.isLeaf()) {
                node.getChildren()
                        .forEach(n -> expandAll(n));
            }
        }
    }

    /**
     * 折叠TreeView的所有节点
     * 
     * @param <T>
     * @param treeView
     */
    public static <T> void collapseAll(final TreeView<T> treeView) {
        TreeItem<T> node = treeView.getRoot();
        collapseAll(node);
    }

    /**
     * 折叠TreeItem的所有节点
     * 
     * @param <T>
     * @param node
     */
    public static <T> void collapseAll(final TreeItem<T> node) {
        if (node != null) {
            if (node.isExpanded()) {
                node.setExpanded(false);
            }
            if (!node.isLeaf()) {
                node.getChildren()
                        .forEach(n -> collapseAll(n));
            }
        }
    }

    /**
     * 对树的所有节点包括子孙节点循环操作
     * 
     * @param <T>
     * @param treeView
     * @param consumer
     */
    public static <T> void loop(final TreeView<T> treeView, final Consumer<TreeItem<T>> consumer) {
        loop(treeView.getRoot(), consumer);
    }

    /**
     * 对给定节点(TreeItem)及所有子孙节点循环操作
     * 
     * @param <T>
     * @param node
     * @param consumer 要执行的操作
     */
    public static <T> void loop(final TreeItem<T> node, final Consumer<TreeItem<T>> consumer) {
        consumer.accept(node);
        if (!node.isLeaf()) {
            node.getChildren()
                    .forEach(n -> loop(n, consumer));
        }
    }
}
